#!/usr/bin/python3
# -*- coding: UTF-8 -*-
"""
初识类:
    - 类定义语法
    - 类对象
    - 实例对象
    - 方法对象
    - 类和实例变量
    - 其它
"""

"""
类定义语法:
class ClassName:
    <statement_1>
    .
    .
    .<statement_N>

class 表示类定义的关键字；
className 表示类名称；
实践中类定义内的语句通常都是函数定义，但也允许有其他语句；
"""

"""
类对象:
类对象支持两种操作:
    属性引用: obj.name，有效的属性名称是类对象被创建时存在于类命名空间中的所有名称
             如下 MyClass 中 MyClass.i 和 MyClass.f 就是有效的属性值
    实例化: 

"""


class MyClass:
    """Asimple example class"""

    def __init__(self):  # 类似于 JAVA 的构造函数，实例化时自动调用
        print("class of MyClass init function excute.")
        self.data = []

    i = 12345

    def f(self):
        return 'hello world'


x = MyClass  # 创建类的新实例并将此对象分配给局部变量 x
print(x.i)
print(x.f('hello'))
print(x.__doc__)


class Complex:
    """__init__() 方法可以有额外的参数以实现更高灵活性"""

    def __init__(self, realpart, imagpart):
        print("class of Complex init function excute.")
        self.r = realpart
        self.i = imagpart


y = Complex(3.0, -4.5)
print(y.r)
print(y.i)

"""
实例对象:
    类创建出来的实例称之为对象
"""
x.counter = 1
while x.counter < 10:
    x.counter = x.counter * 2
print(x.counter)
del x.counter

"""
方法对象:
        
"""
xf = x.f
# while True:
#     print(xf("hello"))

"""
类和实例变量:
一般来说，实例变量用于每个实例的唯一数据，而类变量用于类的所有实例共享的属性和方法
"""


class Dog:
    kind = 'canine'

    def __init__(self, name):
        self.name = name


d = Dog('Fido')
e = Dog('Buddy')
print(d.kind)
print(d.name)
print(e.kind)
print(e.name)


class Dog2:
    tricks = []

    def __init__(self, name):
        self.name = name

    def add_trick(self, trick):
        self.tricks.append(trick)


d = Dog2('Fido')
e = Dog2('Buddy')
d.add_trick('roll over')
e.add_trick('play dead')
print(d.tricks)


class Dog3:

    def __init__(self, name):
        self.name = name
        self.tricks = []

    def add_trick(self, trick):
        self.tricks.append(trick)


d = Dog3('Fido')
e = Dog3('Buddy')
d.add_trick('roll over')
e.add_trick('play dead')
print(d.tricks)
print(e.tricks)
